package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.ResultadoValidacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.Igv;

/**
 * @author zer0
 */
@Service
public class ServicioIgvImpl implements IServicioIgv, Serializable {

    @Inject
    private IDAOIgv daoIgv;

    @Override
    public Collection<Igv> listarIgvsActivos() {
        try {
            return daoIgv.listarActivos(Igv.class);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioIgvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public Collection<Igv> listarTodosIgvs() {
        try {
            return daoIgv.listarTodos(Igv.class);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioIgvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public ResultadoValidacion validarIgv(Igv igv) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public ResultadoServicio guardarIgv(Igv igv) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            if (daoIgv.conseguirUltimoId(Igv.class) != null) {
                igv.setId(daoIgv.conseguirUltimoId(Igv.class) + 1);
            } else {
                igv.setId(1);
            }
            igv.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoIgv.insertar(igv);
        } catch (DAOException ex) {
            ex.printStackTrace();
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio.setMensaje("Ocurrio un problema al tratar de guardar la igv.");
            Logger.getLogger(ServicioIgvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public Igv conseguirIgvPorId(Integer idIgv) {
        try {
            return daoIgv.obtenerEntidadPorId(Igv.class, idIgv);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioIgvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public ResultadoServicio actualizarIgv(Igv igv) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            daoIgv.actualizar(igv);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioIgvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public Igv ConseguirIgvVigente() throws ServiceException {
        try {
            Igv igvVigente = null;
            Date hoy = new Date();
            igvVigente = daoIgv.obtenerEntidadPorId(Igv.class, daoIgv.conseguirUltimoId(Igv.class));
            if (igvVigente != null && igvVigente.getInicioPeriodo().after(hoy)) {
                igvVigente = daoIgv.ConseguirIgvVigente();
            }
            return igvVigente;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public Igv ConseguirIgvPorFecha(Date date) throws ServiceException {
        try {
            Igv igvVigente = null;
            
            igvVigente = daoIgv.obtenerEntidadPorId(Igv.class, daoIgv.conseguirUltimoId(Igv.class));
            if (igvVigente != null && igvVigente.getInicioPeriodo().after(date)) {
                igvVigente = daoIgv.ConseguirIgvPorFecha(date);
            }
            return igvVigente;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }
}
